/*
 * Copyright (c) 2025 DuckDuckGo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.duckduckgo.app.attributed.metrics

import com.duckduckgo.app.attributed.metrics.store.AttributedMetricsDateUtils
import java.time.Instant
import java.time.LocalDate
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.time.temporal.ChronoUnit

class FakeAttributedMetricsDateUtils(var testDate: LocalDate) : AttributedMetricsDateUtils {

    override fun getCurrentDate(): String = getCurrentLocalDate().format(DATE_FORMATTER)

    override fun daysSince(date: String): Int {
        val initDate = LocalDate.parse(date, DATE_FORMATTER)
        return ChronoUnit.DAYS.between(initDate, getCurrentLocalDate()).toInt()
    }

    override fun daysSince(timestamp: Long): Int {
        val installDate = Instant.ofEpochMilli(timestamp)
        return ChronoUnit.DAYS.between(installDate, getCurrentLocalDate()).toInt()
    }

    override fun getDateMinusDays(days: Int): String = getCurrentLocalDate().minusDays(days.toLong()).format(DATE_FORMATTER)

    override fun getDateFromTimestamp(timestamp: Long): String {
        val instant = Instant.ofEpochMilli(timestamp)
        val zonedDateTime = instant.atZone(ET_ZONE)
        return zonedDateTime.format(DATE_FORMATTER)
    }

    private fun getCurrentLocalDate(): LocalDate = testDate

    companion object {
        private val DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd")
        private val ET_ZONE = ZoneId.of("America/New_York")
    }
}
